package modelo.escenario;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class Recorrido {
	private Cruce cruceDesde;
	private Cruce cruceHasta;
	private GuiaT guiaT;
	private int posicionCorrienteTransitable;
	private List<Transitable> listaTransitables;
	
	/**El constructor de recorrido la guia T a utilizar*/
	public Recorrido(GuiaT guia){
		this.guiaT = guia;
		this.listaTransitables = new ArrayList<Transitable>();
		this.posicionCorrienteTransitable = 0;
	}
	
	
	/**Retorna una lista de cuadras que representa el camino minimo
	 * entre el cruce de origen y el de destino*/
	public List<Cuadra> getCaminoMinimo(){
		if (cruceDesde!= null && cruceHasta!=null)
			return guiaT.caminoMinimo(cruceDesde, cruceHasta);
		else return new ArrayList<Cuadra>();
	}
	
	/**Obtiene las cuadras que inciden en un cruce*/
	public Collection<Cuadra> obtenerCuadrasDelCruce(Cruce cruce){
		return guiaT.obtenerCuadrasDelCruce(cruce);
	}

	public Cruce getCruceDesde() {
		return cruceDesde;
	}

	public void setCruceDesde(Cruce cruceDesde) {
		this.cruceDesde = cruceDesde;
	}

	public Cruce getCruceHasta() {
		return cruceHasta;
	}

	public void setCruceHasta(Cruce cruceHasta) {
		this.cruceHasta = cruceHasta;
	}
	
	/**Retorna una lista de Transitables (cruces y cuadras) que representa el camino minimo
	 * entre el cruce de origen y el de destino*/
	public List<Transitable> getCaminoMinimoDeTransitables() {
		
		ArrayList<Transitable> listaTransitables = new ArrayList<Transitable>();
		
		Iterable<Cuadra> cuadras = getCaminoMinimo();
		
		if (cruceHasta != null) listaTransitables.add(cruceHasta);
		for (Cuadra cuadra : cuadras) {
			listaTransitables.add(cuadra);
			listaTransitables.add(cuadra.getCruceDestino());
		}

		return listaTransitables;
	}
	
	/**
	 * Devuelve el corriente Transitable*/
	public Transitable getCorrienteTransitable() {
		if (listaTransitables.isEmpty())
			return null;
		return listaTransitables.get(posicionCorrienteTransitable);
	}

	/**
	 * Devuelve el anterior Transitable*/
	public Transitable getAnteriorTransitable() {
		if (posicionCorrienteTransitable == 0) return getCorrienteTransitable();
		return listaTransitables.get(posicionCorrienteTransitable - 1);
	}
	
	/**
	 * Devuelve el proximo Transitable*/
	public Transitable getSiguienteTransitable() {
		if (listaTransitables.isEmpty())
			return null;
		if (listaTransitables.size() > posicionCorrienteTransitable + 1)
			return listaTransitables.get(posicionCorrienteTransitable + 1);
		return listaTransitables.get(posicionCorrienteTransitable);
	}
	
	public void avanzarCorrienteTransitable() {
		if (posicionCorrienteTransitable < listaTransitables.size()-1)
			posicionCorrienteTransitable++;
	}
}
